home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / e-lang / bsplin10.lha / BSpline / BSpline.e < prev    next >
Text File  |  1996-04-30  |  25KB  |  790 lines

  1. /*
  2. ** Custom B-Spline class in E. ©1996 Kristofer Maad, m93kma@student.tdb.uu.se
  3. */
  4.  
  5. OPT PREPROCESS
  6.  
  7. MODULE 'muimaster', 'libraries/mui', 'libraries/muip',
  8.        'tools/muicustomclass', 'amigalib/boopsi',
  9.        'intuition/classes', 'intuition/classusr',
  10.        'intuition/screens', 'intuition/intuition',
  11.        'utility/tagitem', 'utility', 'utility/utility',
  12.        'dos/dos', 'devices/inputevent',
  13.        'console', 'exec/io',
  14.        'graphics/gfx', 'graphics/rastport'
  15.  
  16. CONST MAXPTS=20
  17.  
  18. CONST MUIA_BSpline_Subdivision    =TAG_USER OR 0
  19. CONST MUIA_BSpline_DragSubdivision=TAG_USER OR 1
  20. CONST MUIA_BSpline_ShowPoints     =TAG_USER OR 2
  21. CONST MUIA_BSpline_Editable       =TAG_USER OR 3
  22.  
  23. ENUM DRAW,ERASE,RUBBERBAND
  24.  
  25. /*
  26. ** Instance data for the custom class
  27. */
  28.  
  29. OBJECT mydata
  30.     xc:PTR TO LONG
  31.     yc:PTR TO LONG
  32.     mi:PTR TO LONG
  33.     subdiv
  34.     dragsubdiv
  35.     editable
  36.     showpts
  37.     numpts
  38.     selptind
  39.     dragging
  40.     lazydraw
  41.     ox
  42.     oy
  43.     dx
  44.     dy
  45.     backgroundcolor
  46.     drawcurvecolor
  47.     drawselectcolor
  48.     curvecolor
  49.     selectcolor
  50.     xormode
  51. ENDOBJECT
  52.  
  53.  
  54. /*
  55. ** Low-level application helper functions
  56. */
  57.  
  58. PROC setcurvemode(data:PTR TO mydata,mode)
  59.     SELECT mode
  60.         CASE DRAW
  61.             data.curvecolor:=data.drawcurvecolor
  62.             data.selectcolor:=data.drawselectcolor
  63.             data.xormode:=FALSE
  64.         CASE ERASE
  65.             data.curvecolor:=data.backgroundcolor
  66.             data.selectcolor:=data.backgroundcolor
  67.             data.xormode:=FALSE
  68.         CASE RUBBERBAND
  69.             data.curvecolor:=Eor(data.drawcurvecolor,data.backgroundcolor)
  70.             data.selectcolor:=Eor(data.drawselectcolor,data.backgroundcolor)
  71.             data.xormode:=TRUE
  72.     ENDSELECT
  73. ENDPROC
  74.  
  75. PROC getindex(data:PTR TO mydata,x,y)
  76.     DEF px,py,ps,i
  77.     FOR i:=data.numpts-1 TO 0 STEP -1
  78.         px:=data.xc[i]
  79.         py:=data.yc[i]
  80.         ps:=ptsize(data.mi[i])
  81.         IF ((x >= (px-ps)) AND (x <= (px+ps)) AND
  82.             (y >= (py-ps)) AND (y <= (py+ps)))
  83.             RETURN i
  84.         ENDIF
  85.     ENDFOR
  86.     RETURN -1
  87. ENDPROC
  88.  
  89. PROC addpt(data:PTR TO mydata,index,x,y)
  90.     DEF i
  91.     IF data.numpts=MAXPTS THEN
  92.         RETURN
  93.     data.numpts:=data.numpts+1
  94.     FOR i:=data.numpts-1 TO index+1 STEP -1
  95.         data.xc[i]:=data.xc[i-1]
  96.         data.yc[i]:=data.yc[i-1]
  97.         data.mi[i]:=data.mi[i-1]
  98.     ENDFOR
  99.     data.xc[index]:=x
  100.     data.yc[index]:=y
  101.     data.mi[index]:=1
  102.     data.selptind:=index
  103. ENDPROC
  104.  
  105. PROC removept(data:PTR TO mydata,index)
  106.     DEF i
  107.     FOR i:=index TO data.numpts-2
  108.         data.xc[i]:=data.xc[i+1]
  109.         data.yc[i]:=data.yc[i+1]
  110.         data.mi[i]:=data.mi[i+1]
  111.     ENDFOR
  112.     data.numpts:=data.numpts-1
  113.     data.selptind:=-1
  114. ENDPROC
  115.  
  116. PROC fcube(x) IS !x*x*x
  117.  
  118. PROC fsqr(x) IS !x*x
  119.  
  120. PROC bfunc(tau)
  121.     IF (!tau<-2.0) OR (!tau>2.0) THEN
  122.         RETURN 0
  123.  
  124.     IF (!tau<=-1.0)
  125.         RETURN !fcube(!2.0 + tau)/6.0
  126.     ELSEIF (!tau<=0.0)
  127.         RETURN !(!4.0 - (!6.0*fsqr(tau)) - (!3.0*fcube(tau)))/6.0
  128.     ELSEIF (!tau<=1.0)
  129.         RETURN !(!4.0 - (!6.0*fsqr(tau)) + (!3.0*fcube(tau)))/6.0
  130.     ELSE
  131.         RETURN !fcube(!2.0 - tau)/6.0
  132.     ENDIF
  133. ENDPROC
  134.  
  135. PROC ptsize(mi) IS 1+mi
  136.  
  137. PROC startdragging(cl:PTR TO iclass,obj:PTR TO mydata)
  138.     DEF data:PTR TO mydata
  139.     data:=INST_DATA(cl,obj)
  140.     Mui_RequestIDCMP(obj,IDCMP_MOUSEMOVE)
  141.     data.dragging:=TRUE
  142.     data.lazydraw:=FALSE
  143. ENDPROC
  144.  
  145. PROC stopdragging(cl:PTR TO iclass,obj:PTR TO mydata)
  146.     DEF data:PTR TO mydata
  147.     data:=INST_DATA(cl,obj)
  148.     Mui_RejectIDCMP(obj,IDCMP_MOUSEMOVE)
  149.     data.dragging:=FALSE
  150.     data.lazydraw:=FALSE
  151. ENDPROC
  152.  
  153. /*
  154. ** High-level application helper functions
  155. */
  156.  
  157. PROC addptfirst(cl:PTR TO iclass,obj:PTR TO mydata,x,y)
  158.     DEF data:PTR TO mydata
  159.     data:=INST_DATA(cl,obj)
  160.     IF ((x >= 0) AND (x < _mwidth(obj)) AND
  161.         (y >= 0)  AND (y < _mheight(obj)))
  162.         setcurvemode(data,ERASE)
  163.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  164.         addpt(data,0,x,y)
  165.         setcurvemode(data,DRAW)
  166.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  167.     ENDIF
  168. ENDPROC
  169.  
  170. PROC addptlast(cl:PTR TO iclass,obj:PTR TO mydata,x,y)
  171.     DEF data:PTR TO mydata
  172.     data:=INST_DATA(cl,obj)
  173.     IF ((x >= 0) AND (x < _mwidth(obj)) AND
  174.         (y >= 0)  AND (y < _mheight(obj)))
  175.         setcurvemode(data,ERASE)
  176.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  177.         addpt(data,data.numpts,x,y)
  178.         setcurvemode(data,DRAW)
  179.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  180.     ENDIF
  181. ENDPROC
  182.  
  183. PROC addptbefore(cl:PTR TO iclass,obj:PTR TO mydata,x,y)
  184.     DEF data:PTR TO mydata
  185.     data:=INST_DATA(cl,obj)
  186.     IF ((data.selptind<>-1) AND
  187.         (x >= 0) AND (x < _mwidth(obj)) AND
  188.         (y >= 0)  AND (y < _mheight(obj)))
  189.         setcurvemode(data,ERASE)
  190.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  191.         addpt(data,data.selptind,x,y)
  192.         setcurvemode(data,DRAW)
  193.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  194.     ENDIF
  195. ENDPROC
  196.  
  197. PROC addptafter(cl:PTR TO iclass,obj:PTR TO mydata,x,y)
  198.     DEF data:PTR TO mydata
  199.     data:=INST_DATA(cl,obj)
  200.     IF ((data.selptind<>-1) AND
  201.         (x >= 0) AND (x < _mwidth(obj)) AND
  202.         (y >= 0)  AND (y < _mheight(obj)))
  203.         setcurvemode(data,ERASE)
  204.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  205.         addpt(data,data.selptind+1,x,y)
  206.         setcurvemode(data,DRAW)
  207.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  208.     ENDIF
  209. ENDPROC
  210.  
  211. PROC changeselptmultind(cl:PTR TO iclass,obj:PTR TO mydata)
  212.     DEF data:PTR TO mydata,i
  213.     data:=INST_DATA(cl,obj)
  214.     i:=data.selptind
  215.     IF i<>-1
  216.         setcurvemode(data,ERASE)
  217.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  218.         data.mi[i]:=data.mi[i]+1
  219.         IF data.mi[i]>3 THEN data.mi[i]:=data.mi[i]-3
  220.         setcurvemode(data,DRAW)
  221.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  222.     ENDIF
  223. ENDPROC
  224.  
  225. PROC removeselpt(cl:PTR TO iclass,obj:PTR TO mydata)
  226.     DEF data:PTR TO mydata,i
  227.     data:=INST_DATA(cl,obj)
  228.     i:=data.selptind
  229.     IF i<>-1
  230.         setcurvemode(data,ERASE)
  231.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  232.         removept(data,i)
  233.         setcurvemode(data,DRAW)
  234.         Mui_Redraw(obj,MADF_DRAWUPDATE)
  235.     ENDIF
  236. ENDPROC
  237.  
  238.  
  239. /*
  240. ** Functions implementing object methods
  241. */
  242.  
  243. PROC mNew(cl:PTR TO iclass,obj,msg:PTR TO opset)
  244.     DEF data:PTR TO mydata
  245.     DEF tags:PTR TO tagitem
  246.     DEF tag:PTR TO tagitem
  247.     DEF t
  248.  
  249.     IF ((obj:=doSuperMethodA(cl,obj,msg))=NIL) THEN
  250.         RETURN FALSE
  251.  
  252.     data:=INST_DATA(cl,obj)
  253.  
  254.     NEW data.xc[MAXPTS]
  255.     NEW data.yc[MAXPTS]
  256.     NEW data.mi[MAXPTS]
  257.  
  258.     IF (data.xc=NIL) OR (data.yc=NIL) OR (data.mi=NIL) THEN
  259.         WriteF('Baap!\n')
  260.  
  261.     data.subdiv:=10
  262.     data.dragsubdiv:=5
  263.     data.showpts:=TRUE
  264.     data.editable:=TRUE
  265.     data.numpts:=0
  266.     data.selptind:=-1
  267.     data.dragging:=FALSE
  268.  
  269.     tags:=msg.attrlist
  270.     WHILE (tag:=NextTagItem({tags}))
  271.         t:=tag.tag
  272.         SELECT t
  273.             CASE MUIA_BSpline_Subdivision
  274.                 data.subdiv:=tag.data
  275.             CASE MUIA_BSpline_DragSubdivision
  276.                 data.dragsubdiv:=tag.data
  277.             CASE MUIA_BSpline_ShowPoints
  278.                 data.showpts:=tag.data
  279.             CASE MUIA_BSpline_Editable
  280.                 data.editable:=tag.data
  281.         ENDSELECT
  282.     ENDWHILE
  283. ENDPROC obj
  284.  
  285. PROC mSet(cl:PTR TO iclass,obj,msg:PTR TO opset)
  286.     DEF data:PTR TO mydata
  287.     DEF tags:PTR TO tagitem
  288.     DEF tag:PTR TO tagitem
  289.     DEF t
  290.  
  291.     data:=INST_DATA(cl,obj)
  292.  
  293.     tags:=msg.attrlist
  294.     WHILE (tag:=NextTagItem({tags}))
  295.         t:=tag.tag
  296.         SELECT t
  297.             CASE MUIA_BSpline_Subdivision
  298.                 IF data.subdiv<>tag.data
  299.                     IF Not(data.xormode)
  300.                         setcurvemode(data,ERASE)
  301.                         Mui_Redraw(obj,MADF_DRAWUPDATE)
  302.                     ENDIF
  303.                     data.subdiv:=tag.data
  304.                     IF Not(data.xormode)
  305.                         setcurvemode(data,DRAW)
  306.                         Mui_Redraw(obj,MADF_DRAWUPDATE)
  307.                     ENDIF
  308.                 ENDIF
  309.             CASE MUIA_BSpline_DragSubdivision
  310.                 IF data.dragsubdiv<>tag.data
  311.                     IF data.lazydraw
  312.                         data.lazydraw:=FALSE
  313.                         Mui_Redraw(obj,MADF_DRAWUPDATE)
  314.                         data.dragsubdiv:=tag.data
  315.                         Mui_Redraw(obj,MADF_DRAWUPDATE)
  316.                         data.lazydraw:=TRUE
  317.                     ELSE
  318.                         data.dragsubdiv:=tag.data
  319.                     ENDIF
  320.                 ENDIF
  321.             CASE MUIA_BSpline_ShowPoints
  322.                 IF data.showpts<>tag.data
  323.                     IF data.xormode
  324.                         stopdragging(cl,obj)
  325.                         Mui_Redraw(obj,MADF_DRAWUPDATE)
  326.                         data.xc[data.selptind]:=data.ox
  327.                         data.yc[data.selptind]:=data.oy
  328.                     ELSEIF data.showpts
  329.                         setcurvemode(data,ERASE)
  330.                         Mui_Redraw(obj,MADF_DRAWUPDATE)
  331.                     ENDIF
  332.                     data.showpts:=tag.data
  333.                     setcurvemode(data,DRAW)
  334.                     Mui_Redraw(obj,MADF_DRAWUPDATE)
  335.                 ENDIF
  336.             CASE MUIA_BSpline_Editable
  337.                 IF data.editable<>tag.data
  338.                     IF data.xormode
  339.                         stopdragging(cl,obj)
  340.                         Mui_Redraw(obj,MADF_DRAWUPDATE)
  341.                         data.xc[data.selptind]:=data.ox
  342.                         data.yc[data.selptind]:=data.oy
  343.                     ENDIF
  344.                     data.editable:=tag.data
  345.                     setcurvemode(data,DRAW)
  346.                     Mui_Redraw(obj,MADF_DRAWUPDATE)
  347.                 ENDIF
  348.         ENDSELECT
  349.     ENDWHILE
  350.  
  351.     RETURN doSuperMethodA(cl,obj,msg)
  352. ENDPROC
  353.  
  354.  
  355. PROC mAskMinMax(cl:PTR TO iclass,obj,msg:PTR TO muip_askminmax)
  356.     doSuperMethodA(cl,obj,msg)
  357.  
  358.     msg.minmaxinfo.minwidth := msg.minmaxinfo.minwidth + 400
  359.     msg.minmaxinfo.defwidth := msg.minmaxinfo.defwidth + 400
  360.     msg.minmaxinfo.maxwidth := msg.minmaxinfo.maxwidth + 400
  361.  
  362.     msg.minmaxinfo.minheight := msg.minmaxinfo.minheight + 400
  363.     msg.minmaxinfo.defheight := msg.minmaxinfo.defheight + 400
  364.     msg.minmaxinfo.maxheight := msg.minmaxinfo.maxheight + 400
  365. ENDPROC 0
  366.  
  367. PROC mDraw(cl:PTR TO iclass,obj:PTR TO mydata,msg:PTR TO muip_draw)
  368.     DEF data:PTR TO mydata
  369.     DEF index,firstindex,lastindex,i,j,ps,n,x,y,ox,oy,t,istart,iend,lazydraw,subdiv
  370.     DEF left,top
  371.     DEF cleft,ctop,cright,cbottom,cwidth,cheight,cliphandle
  372.     DEF xcb[200]:ARRAY OF LONG
  373.     DEF ycb[200]:ARRAY OF LONG
  374.  
  375.     data:=INST_DATA(cl,obj)
  376.  
  377.     SetDrMd(_rp(obj),1)
  378.     SetWriteMask(_rp(obj),-1)
  379.     doSuperMethodA(cl,obj,msg)
  380.  
  381.     IF (msg.flags AND MADF_DRAWUPDATE) /* called from our input method */
  382.         lazydraw:=data.lazydraw
  383.     ELSEIF (msg.flags AND MADF_DRAWOBJECT)
  384.         SetAPen(_rp(obj),data.backgroundcolor)
  385.         RectFill(_rp(obj),_mleft(obj),_mtop(obj),_mright(obj),_mbottom(obj))
  386.         lazydraw:=FALSE
  387.     ELSE
  388.         RETURN 0
  389.     ENDIF
  390.  
  391.     left:=_mleft(obj)
  392.     top:=_mtop(obj)
  393.  
  394.     cleft:=_mleft(obj)
  395.     ctop:=_mtop(obj)
  396.     cright:=_mright(obj)
  397.     cbottom:=_mbottom(obj)
  398.  
  399.     IF cleft<0 THEN cleft:=0
  400.     IF ctop<0 THEN ctop:=0
  401.  
  402.     cwidth:=cright-cleft+1
  403.     cheight:=cbottom-ctop+1
  404.  
  405.     cliphandle:=Mui_AddClipping(muiRenderInfo(obj),cleft,ctop,cwidth,cheight)
  406.  
  407.     SetDrMd(_rp(obj),IF data.xormode THEN 2 ELSE 1)
  408.     subdiv:=IF data.xormode THEN data.dragsubdiv ELSE data.subdiv
  409.  
  410.     IF data.showpts
  411.         IF lazydraw
  412.             i:=data.selptind
  413.             x:=data.xc[i]+left
  414.             y:=data.yc[i]+top
  415.             ps:=ptsize(data.mi[i])
  416.             IF data.xormode
  417.                 SetWriteMask(_rp(obj),data.selectcolor)
  418.             ELSE
  419.                 SetAPen(_rp(obj),data.selectcolor)
  420.             ENDIF
  421.             RectFill(_rp(obj),x-ps,y-ps,x+ps,y+ps)
  422.             IF data.xormode
  423.                 SetWriteMask(_rp(obj),data.curvecolor)
  424.             ELSE
  425.                 SetAPen(_rp(obj),data.curvecolor)
  426.             ENDIF
  427.         ELSE
  428.             IF data.xormode
  429.                 SetWriteMask(_rp(obj),data.curvecolor)
  430.             ELSE
  431.                 SetAPen(_rp(obj),data.curvecolor)
  432.             ENDIF
  433.             FOR i:=0 TO data.numpts-1
  434.                 x:=data.xc[i]+left
  435.                 y:=data.yc[i]+top
  436.                 ps:=ptsize(data.mi[i])
  437.                 IF data.editable AND (data.selptind=i)
  438.                     IF data.xormode
  439.                         SetWriteMask(_rp(obj),data.selectcolor)
  440.                     ELSE
  441.                         SetAPen(_rp(obj),data.selectcolor)
  442.                     ENDIF
  443.                     RectFill(_rp(obj),x-ps,y-ps,x+ps,y+ps)
  444.                     IF data.xormode
  445.                         SetWriteMask(_rp(obj),data.curvecolor)
  446.                     ELSE
  447.                         SetAPen(_rp(obj),data.curvecolor)
  448.                     ENDIF
  449.                 ELSE
  450.                     RectFill(_rp(obj),x-ps,y-ps,x+ps,y+ps)
  451.                 ENDIF
  452.             ENDFOR
  453.         ENDIF
  454.     ELSE
  455.         IF data.xormode
  456.             SetWriteMask(_rp(obj),data.curvecolor)
  457.         ELSE
  458.             SetAPen(_rp(obj),data.curvecolor)
  459.         ENDIF
  460.     ENDIF
  461.  
  462.     index:=0
  463.  
  464.     FOR i:=0 TO data.numpts-1
  465.         IF i=data.selptind THEN firstindex:=index
  466.         FOR j:=1 TO data.mi[i]
  467.             xcb[index +1]:=data.xc[i]
  468.             ycb[index +1]:=data.yc[i]
  469.             index:=index+1
  470.         ENDFOR
  471.         IF i=data.selptind THEN lastindex:=index-1
  472.     ENDFOR
  473.  
  474.     n:=index-1
  475.  
  476.     xcb[-1 +1]:=(2*xcb[0 +1])-xcb[1 +1]
  477.     ycb[-1 +1]:=(2*ycb[0 +1])-ycb[1 +1]
  478.  
  479.     xcb[n+1 +1]:=(2*xcb[n +1])-xcb[n-1 +1]
  480.     ycb[n+1 +1]:=(2*ycb[n +1])-ycb[n-1 +1]
  481.  
  482.     ox:=-1
  483.  
  484.     IF lazydraw
  485.         istart:=firstindex-2
  486.         IF istart<0 THEN istart:=0
  487.         iend:=lastindex+2
  488.         IF iend>n THEN iend:=n
  489.         istart:=istart*subdiv
  490.         iend:=iend*subdiv
  491.     ELSE
  492.         istart:=0
  493.         iend:=n*subdiv
  494.     ENDIF
  495.  
  496.     IF(n>=1)
  497.         FOR j:=istart TO iend
  498.             t:=j!/(subdiv!)
  499.             x:=0.0
  500.             y:=0.0
  501.             FOR i:=!Ffloor(t-1.0)! TO !Fceil(t+1.0)!
  502.                 x:=!x+(!(xcb[i +1]!)*bfunc(!t-(i!)))
  503.                 y:=!y+(!(ycb[i +1]!)*bfunc(!t-(i!)))
  504.             ENDFOR
  505.             IF ox<>-1
  506.                 Move(_rp(obj),ox+left,oy+top)
  507.                 Draw(_rp(obj),!x!+left,!y!+top)
  508.             ENDIF
  509.             ox:=!x!
  510.             oy:=!y!
  511.             IF data.xormode AND (j<>istart) AND (j<>iend) THEN
  512.                 WritePixel(_rp(obj),ox+left,oy+top)
  513.         ENDFOR
  514.     ENDIF
  515.  
  516.     Mui_RemoveClipping(muiRenderInfo(obj),cliphandle)
  517.  
  518.     SetDrMd(_rp(obj),1)
  519.     SetWriteMask(_rp(obj),-1)
  520. ENDPROC 0
  521.  
  522.  
  523. PROC mSetup(cl:PTR TO iclass,obj:PTR TO mydata,msg:PTR TO muip_handleinput)
  524.     DEF data:PTR TO mydata
  525.     data:=INST_DATA(cl,obj)
  526.  
  527.     IF (doSuperMethodA(cl,obj,msg)=FALSE) THEN
  528.         RETURN FALSE
  529.  
  530.     data.backgroundcolor:=_dri(obj).pens[SHINEPEN]
  531.     data.drawcurvecolor:=_dri(obj).pens[SHADOWPEN]
  532.     data.drawselectcolor:=_dri(obj).pens[FILLPEN]
  533.  
  534.     setcurvemode(data,DRAW)
  535.  
  536.     Mui_RequestIDCMP(obj,IDCMP_MOUSEBUTTONS OR IDCMP_RAWKEY)
  537. ENDPROC MUI_TRUE
  538.  
  539. PROC mCleanup(cl:PTR TO iclass,obj,msg:PTR TO muip_handleinput)
  540.     Mui_RejectIDCMP(obj,IDCMP_MOUSEBUTTONS OR IDCMP_RAWKEY)
  541.     RETURN doSuperMethodA(cl,obj,msg)
  542. ENDPROC
  543.  
  544. PROC mHandleInput(cl:PTR TO iclass,obj:PTR TO mydata,msg:PTR TO muip_handleinput)
  545.     DEF data:PTR TO mydata
  546.     DEF x,y,i
  547.     DEF class
  548.     DEF ievent:inputevent
  549.     DEF str[80]:ARRAY OF CHAR
  550.     DEF key
  551.  
  552.     data:=INST_DATA(cl,obj)    
  553.  
  554.     IF (msg.imsg <> NIL)
  555.         class:=msg.imsg.class
  556.  
  557.         IF data.dragging
  558.             SELECT class
  559.                 CASE IDCMP_MOUSEBUTTONS
  560.                     IF (msg.imsg.code=SELECTUP) OR (msg.imsg.code=MENUDOWN)
  561.                         IF data.lazydraw
  562.                             data.lazydraw:=FALSE
  563.                             setcurvemode(data,RUBBERBAND)
  564.                             Mui_Redraw(obj,MADF_DRAWUPDATE)
  565.                             IF msg.imsg.code=MENUDOWN
  566.                                 data.xc[data.selptind]:=data.ox
  567.                                 data.yc[data.selptind]:=data.oy
  568.                             ENDIF
  569.                             setcurvemode(data,DRAW)
  570.                             Mui_Redraw(obj,MADF_DRAWUPDATE)
  571.                         ENDIF
  572.                         stopdragging(cl,obj)
  573.                     ENDIF
  574.                 CASE IDCMP_MOUSEMOVE
  575.                     x:=msg.imsg.mousex-_mleft(obj)+data.dx
  576.                     y:=msg.imsg.mousey-_mtop(obj)+data.dy
  577.                     IF x<0 THEN x:=0
  578.                     IF x>=_mwidth(obj) THEN x:=_mwidth(obj)-1
  579.                     IF y<0 THEN y:=0
  580.                     IF y>=_mheight(obj) THEN y:=_mheight(obj)-1
  581.                     i:=data.selptind
  582.                     IF (data.xc[i]<>x) OR (data.yc[i]<>y)
  583.                         IF data.lazydraw
  584.                             setcurvemode(data,RUBBERBAND)
  585.                         ELSE
  586.                             setcurvemode(data,ERASE)
  587.                         ENDIF
  588.                         Mui_Redraw(obj,MADF_DRAWUPDATE)
  589.                         data.xc[i]:=x
  590.                         data.yc[i]:=y
  591.                         setcurvemode(data,RUBBERBAND)
  592.                         Mui_Redraw(obj,MADF_DRAWUPDATE)
  593.                         data.lazydraw:=TRUE
  594.                     ENDIF
  595.             ENDSELECT
  596.         ELSE
  597.             IF data.showpts AND data.editable
  598.                 SELECT class
  599.                     CASE IDCMP_RAWKEY
  600.                         x:=msg.imsg.mousex-_mleft(obj)
  601.                         y:=msg.imsg.mousey-_mtop(obj)
  602.                         ievent.nextevent:=NIL
  603.                         ievent.class:=IECLASS_RAWKEY
  604.                         ievent.code:=msg.imsg.code
  605.                         ievent.qualifier:=msg.imsg.qualifier
  606.                         ievent.eventaddress:=msg.imsg.iaddress
  607.                         IF RawKeyConvert(ievent, str, 80, NIL)=1
  608.                             key:=str[0]
  609.                             SELECT key
  610.                                 CASE "f"
  611.                                     addptfirst(cl,obj,x,y)
  612.                                 CASE "l"
  613.                                     addptlast(cl,obj,x,y)
  614.                                 CASE "b"
  615.                                     addptbefore(cl,obj,x,y)
  616.                                 CASE "a"
  617.                                     addptafter(cl,obj,x,y)
  618.                                 CASE "m"
  619.                                     changeselptmultind(cl,obj)
  620.                                 CASE "d"
  621.                                     removeselpt(cl,obj)
  622.                             ENDSELECT
  623.                         ENDIF
  624.                     CASE IDCMP_MOUSEBUTTONS
  625.                         IF (msg.imsg.code=SELECTDOWN)
  626.                             x:=msg.imsg.mousex-_mleft(obj)
  627.                             y:=msg.imsg.mousey-_mtop(obj)
  628.                             IF ((x >= 0) AND (x < _mwidth(obj)) AND
  629.                                 (y >= 0)  AND (y < _mheight(obj)))
  630.                                 i:=getindex(data,x,y)
  631.                                 IF data.selptind<>i
  632.                                     data.selptind:=i
  633.                                     Mui_Redraw(obj,MADF_DRAWUPDATE)
  634.                                 ENDIF
  635.                                 IF i<>-1
  636.                                     data.ox:=data.xc[i]
  637.                                     data.oy:=data.yc[i]
  638.                                     data.dx:=data.xc[i]-x
  639.                                     data.dy:=data.yc[i]-y
  640.                                     startdragging(cl,obj)
  641.                                 ENDIF
  642.                             ENDIF
  643.                         ENDIF
  644.                 ENDSELECT
  645.             ENDIF
  646.         ENDIF
  647.     ENDIF
  648.  
  649.     RETURN 0
  650. ENDPROC
  651.  
  652.  
  653. /*
  654. ** Class dispatcher
  655. */
  656.  
  657. PROC myDispatcher(cl:PTR TO iclass,obj,msg:PTR TO msg)
  658.     DEF methodID
  659.  
  660.     methodID:=msg.methodid
  661.     SELECT methodID
  662.         CASE OM_NEW;            RETURN mNew        (cl,obj,msg)
  663.         CASE OM_SET;            RETURN mSet        (cl,obj,msg)
  664.         CASE MUIM_AskMinMax;    RETURN mAskMinMax  (cl,obj,msg)
  665.         CASE MUIM_Draw     ;    RETURN mDraw       (cl,obj,msg)
  666.         CASE MUIM_HandleInput;  RETURN mHandleInput(cl,obj,msg)
  667.         CASE MUIM_Setup;        RETURN mSetup      (cl,obj,msg)
  668.         CASE MUIM_Cleanup;      RETURN mCleanup    (cl,obj,msg)
  669.     ENDSELECT
  670.  
  671.     RETURN doSuperMethodA(cl,obj,msg)
  672. ENDPROC
  673.  
  674.  
  675. /*
  676. ** Main
  677. */
  678.  
  679. PROC main() HANDLE
  680.     DEF app=NIL,window,slider1,slider2,check1,check2,myobj,sigs=0,
  681.         mcc=NIL:PTR TO mui_customclass,ioreq:iostd
  682.  
  683.     IF (utilitybase:=OpenLibrary(UTILITYNAME, 39))=NIL THEN
  684.         Raise('Failed to open utility.library')
  685.  
  686.     IF (muimasterbase:=OpenLibrary(MUIMASTER_NAME, MUIMASTER_VMIN))=NIL THEN
  687.         Raise('Failed to open muimaster.library')
  688.  
  689.     IF (mcc:=eMui_CreateCustomClass(NIL,MUIC_Area,NIL,SIZEOF mydata,{myDispatcher}))=NIL THEN
  690.         Raise('Failed to create custom class')
  691.  
  692.     IF OpenDevice('console.device', -1, ioreq, 0)<>0 THEN
  693.         Raise('Failed to open console.device')
  694.     consoledevice:=ioreq.device
  695.  
  696.     app:=ApplicationObject,
  697.         MUIA_Application_Title      , 'B-Spline',
  698.         MUIA_Application_Version    , '$VER: BSpline 1.0 (12.04.96)',
  699.         MUIA_Application_Copyright  , '©1996, Kristofer Maad',
  700.         MUIA_Application_Author     , 'Kristofer Maad',
  701.         MUIA_Application_Description, 'B-Spline editor with MUI in AmigaE.',
  702.         MUIA_Application_Base       , 'BSPLINE',
  703.  
  704.         SubWindow, window := WindowObject,
  705.             MUIA_Window_Title, 'B-Spline example with MUI in AmigaE',
  706.             MUIA_Window_ID   , "BSPL",
  707.             WindowContents, VGroup,
  708.                 Child, ScrollgroupObject,
  709.                     MUIA_CycleChain, MUI_TRUE,
  710.                     MUIA_Scrollgroup_Contents, VirtgroupObject,
  711.                         Child, myobj := NewObjectA(mcc.mcc_class,NIL,
  712.                             [
  713.                             TextFrame,
  714.                             MUIA_FillArea, FALSE,
  715.                             End,
  716.                         End,
  717.                     End,
  718.                 Child, GroupObject,
  719.                     MUIA_Group_Columns, 4,
  720.                     MUIA_Frame, MUIV_Frame_Group,
  721.                     MUIA_FrameTitle, 'Curve settings',
  722.                     Child, Label2('Subdivision:'),
  723.                     Child, slider1 := SliderObject,
  724.                         MUIA_CycleChain, MUI_TRUE,
  725.                         MUIA_Slider_Min, 1,
  726.                         MUIA_Slider_Max, 20,
  727.                         End,
  728.                     Child, Label1('Show points:'),
  729.                     Child, check1 := CheckMark(MUI_TRUE),
  730.  
  731.                     Child, Label2('Drag subdiv.:'),
  732.                     Child, slider2 := SliderObject,
  733.                         MUIA_CycleChain, MUI_TRUE,
  734.                         MUIA_Slider_Min, 1,
  735.                         MUIA_Slider_Max, 20,
  736.                         End,
  737.                     Child, Label1('Editable:'),
  738.                     Child, check2 := CheckMark(MUI_TRUE),
  739.                     End,
  740.                 End,
  741.             End,
  742.         End
  743.  
  744.     IF app=NIL THEN Raise('Failed to create Application.')
  745.  
  746.     set(window,MUIA_Window_DefaultObject,myobj);
  747.  
  748.     doMethodA(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,
  749.               app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
  750.  
  751.     doMethodA(slider1,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  752.               myobj,3,MUIM_Set,MUIA_BSpline_Subdivision,MUIV_TriggerValue])
  753.  
  754.     doMethodA(slider2,[MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,
  755.               myobj,3,MUIM_Set,MUIA_BSpline_DragSubdivision,MUIV_TriggerValue])
  756.  
  757.     doMethodA(check1,[MUIM_Notify,MUIA_Selected,MUIV_EveryTime,
  758.               myobj,3,MUIM_Set,MUIA_BSpline_ShowPoints,MUIV_TriggerValue])
  759.  
  760.     doMethodA(check2,[MUIM_Notify,MUIA_Selected,MUIV_EveryTime,
  761.               myobj,3,MUIM_Set,MUIA_BSpline_Editable,MUIV_TriggerValue])
  762.  
  763.     doMethodA(check1,[MUIM_Notify,MUIA_Selected,FALSE,
  764.               check2,3,MUIM_Set,MUIA_Disabled,MUI_TRUE])
  765.  
  766.     doMethodA(check1,[MUIM_Notify,MUIA_Selected,MUI_TRUE,
  767.               check2,3,MUIM_Set,MUIA_Disabled,FALSE])
  768.  
  769.     set(slider1,MUIA_Slider_Level,10)
  770.     set(slider2,MUIA_Slider_Level,5)
  771.  
  772.     set(window,MUIA_Window_Open,MUI_TRUE)
  773.  
  774.     WHILE (doMethodA(app,[MUIM_Application_NewInput,{sigs}]) <> MUIV_Application_ReturnID_Quit)
  775.         IF sigs THEN
  776.             IF ((sigs:=Wait(sigs OR SIGBREAKF_CTRL_C)) AND SIGBREAKF_CTRL_C) THEN
  777.                 Raise('Break! - Exiting');
  778.     ENDWHILE
  779.  
  780.     set(window,MUIA_Window_Open,FALSE)
  781.  
  782. EXCEPT DO
  783.     IF app THEN Mui_DisposeObject(app)                /* dispose all objects. */
  784.     IF mcc THEN Mui_DeleteCustomClass(mcc)            /* delete the custom class. */
  785.     IF muimasterbase THEN CloseLibrary(muimasterbase) /* close libraries */
  786.     IF utilitybase THEN CloseLibrary(utilitybase)
  787.     IF consoledevice THEN CloseDevice(ioreq)          /* close device */
  788.     IF exception THEN WriteF('\s\n',exception)
  789. ENDPROC
  790.